//package com.zg.nacos.manager;
//import com.zg.nacos.domain.bo.InstanceInfo;
//import lombok.RequiredArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.http.ResponseEntity;
//import org.springframework.scheduling.annotation.Scheduled;
//import org.springframework.stereotype.Component;
//import org.springframework.web.client.RestTemplate;
//
//import java.util.Map;
//
///**
// * <p>Description: </p>
// *
// * @author zhanfeng.liang
// * @since 2025/6/27 20:01
// */
//
//
//@Slf4j
//@Component
//@RequiredArgsConstructor
//public class HealthCheckTask1 {
//    private final InstanceManager instanceManager;
//    private final NamingServiceManager namingServiceManager;
//    private final RestTemplate restTemplate = new RestTemplate();
//
//    private static final int MAX_FAILURE_COUNT = 3; // 最大失败次数阈值
//    private static final long UNHEALTHY_DEREGISTER_DELAY = 300000; // 不健康状态5分钟后注销
//
//
//    @Scheduled(fixedRate = 30000)
//    public void checkAllInstances() {
//        Map<String, InstanceInfo> instances = instanceManager.getAllInstances();
//        instances.forEach((key, instance) -> {
//            // 处理已标记为不健康且超过延迟时间的实例
//            if (instance.getHealthStatus() == InstanceInfo.HealthStatus.UNHEALTHY) {
//                handleDelayedDeregister(instance);
//                return;
//            }
//
//            // 执行健康检查
//            try {
//                ResponseEntity<String> response = restTemplate.getForEntity(
//                        instance.getHttpHealthCheckUrl(), String.class);
//
//                if (response.getStatusCode().is2xxSuccessful()) {
//                    handleHealthyInstance(instance);
//                } else {
//                    handleUnhealthyInstance(instance);
//                }
//            } catch (Exception e) {
//                log.warn("健康检查失败: {} | 错误: {}", instance.getHealthCheckUrl(), e.getMessage());
//                handleUnhealthyInstance(instance);
//            }
//        });
//    }
//
//    private void handleHealthyInstance(InstanceInfo instance) {
//        // 重置健康状态和失败计数
//        instance.markHealthy();
//        log.info("服务恢复健康: {}", instance);
//    }
//
//    private void handleUnhealthyInstance(InstanceInfo instance) {
//        // 增加失败计数
//        instance.incrementFailureCount();
//
//        // 根据失败计数决定状态
//        if (instance.getFailureCount() >= MAX_FAILURE_COUNT) {
//            // 达到阈值：标记为不健康并设置注销时间
//            instance.markUnhealthy();
//            log.error("服务连续失败{}次，标记为不健康: {}", MAX_FAILURE_COUNT, instance);
//        } else {
//            // 未达阈值：标记为可疑
//            instance.markSuspicious();
//            log.warn("服务检查失败，当前失败次数: {}/{} | 实例: {}",
//                    instance.getFailureCount(), MAX_FAILURE_COUNT, instance);
//        }
//    }
//
//    private void handleDelayedDeregister(InstanceInfo instance) {
//        long unhealthyDuration = System.currentTimeMillis() - instance.getUnhealthyTime();
//
//        if (unhealthyDuration > UNHEALTHY_DEREGISTER_DELAY) {
//            try {
//                log.warn("服务持续不健康超过{}分钟，注销实例: {}",
//                        UNHEALTHY_DEREGISTER_DELAY/60000, instance);
//
//                namingServiceManager.getNamingService(instance.getNamespace())
//                        .deregisterInstance(
//                                instance.getServiceName(),
//                                instance.getIp(),
//                                instance.getPort()
//                        );
//
//                // 移除实例记录
//                instanceManager.removeInstance(
//                        instance.getNamespace(),
//                        instance.getServiceName(),
//                        instance.getIp(),
//                        instance.getPort()
//                );
//            } catch (Exception e) {
//                log.error("注销实例失败: {}", instance, e);
//            }
//        } else {
//            log.info("服务仍处于不健康状态: {}/{}分钟 | 实例: {}",
//                    unhealthyDuration/60000, UNHEALTHY_DEREGISTER_DELAY/60000, instance);
//        }
//    }
//}